import pickle

from FonteDeRendaFrame import *
from Paciente import *
from Profissional import *
from Renda import *
from RendaPaciente import *


#O objetivo desta classe eh cadastrar e controlar as renda do sistema
class BancoDeDados:
    def __init__(self):
        self.lista_pacientes = []
        self.lista_profissionais = []
        self.lista_nomes_pacientes = []
        self.lista_nomes_profissionais = []        
        self.lista_convenios = []
        self.lista_rendas = []
        self.lista_rendasPac = []
        self.choice_convenios = ''
        self.__pesquisa_nome = ''
        self.__pesquisa_CPF = ''
        self.__paciente_selecionado = None
        self.__profissional_selecionado = None
        self.paciente_nulo = Paciente("","","","","","","","","","","","","")


    def get_paciente_selecionado(self):
        return self.__paciente_selecionado
    
    def set_paciente_selecionado(self):
        self.__paciente_selecionado
        
    def get_profissional_selecionado(self):
        return self.__profissional_selecionado
    
    def set_profissional_selecionado(self):
        self.__profissional_selecionado
      
                 
                         

        ################ FUNCOES RELACIONADAS AO CARREGAMENTO E UTILIZACAO DO BANCO DE DADOS ##################



    #carrega os dados do arquivo em uma lista
    def carregar_base_arquivo(self,nome_arquivo):

        arquivo = open(nome_arquivo)
        lista = pickle.load(arquivo)
        arquivo.close()
        return lista

    #atualiza a lista de pacientes e salva no arquivo
    def atualizar_base_arquivo_paciente(self,nome_arquivo,objeto):
        #atualiza a lista em memoria antes de salvar o arquivo com o novo objeto
        self.lista_pacientes=self.carregar_base_arquivo(nome_arquivo)
        if objeto != '':
            self.lista_pacientes.append(objeto)
        arquivo = open(nome_arquivo,"w")
        pickle.dump(self.lista_pacientes,arquivo)
        arquivo.close()

    #atualiza a lista de profissionais e salva no arquivo
    def atualizar_base_arquivo_profissional(self,nome_arquivo,objeto):
        #atualiza a lista em memoria antes de salvar o arquivo com o novo objeto
        self.lista_profissionais=self.carregar_base_arquivo(nome_arquivo)
        if objeto != '':
            self.lista_profissionais.append(objeto)
        arquivo = open(nome_arquivo,"w")
        pickle.dump(self.lista_profissionais,arquivo)
        arquivo.close()
        
    def atualizar_base_arquivo_renda(self,nome_arquivo,objeto):
        self.lista_rendas=self.carregar_base_arquivo(nome_arquivo)
        if objeto != '':
            self.lista_rendas.append(objeto)
        arquivo = open(nome_arquivo,"w")
        pickle.dump(self.lista_rendas,arquivo)
        arquivo.close()

    def atualizar_base_arquivo_rendaPac(self,nome_arquivo,objeto):
        self.lista_rendasPac=self.carregar_base_arquivo(nome_arquivo)
        if objeto != '':
            self.lista_rendasPac.append(objeto)
        arquivo = open(nome_arquivo,"w")
        pickle.dump(self.lista_rendasPac,arquivo)
        arquivo.close()

    def atualizar_base_arquivo_convenio(self,nome_arquivo,objeto):
        self.lista_convenios=self.carregar_base_arquivo(nome_arquivo)
        if objeto!='':
            self.lista_convenios.append(objeto)
        arquivo = open(nome_arquivo,"w")
        pickle.dump(self.lista_convenios,arquivo)
        arquivo.close()

    # funcao que cria um novo id para determinado objeto
    def get_novo_id(self, nome_arquivo):
        arquivo = open(nome_arquivo)
        lista = pickle.load(arquivo)
        arquivo.close()
        
        contador = 0
        for i in lista:
            contador = contador + 1

        return contador


    def get_objetos_rendaPac(self):
        return self.carregar_base_arquivo("rendaPac.tab")

    def get_objetos_renda(self):
        return self.carregar_base_arquivo("renda.tab")        
        ################ FUNCOES RELACIONADAS AO PACIENTE ##################


        
    #funcao que cadastra o objeto paciente numa lista em um arquivo
    def cadastrar_paciente(self, nome, cpf, sexo, telefone, celular, rua, bairro, numero, cidade, cep, estado, email, convenio):
        #aux serve para saber qts pessoas existem na lista de pacientes e garar um novo id
        aux=self.carregar_base_arquivo("paciente.tab")
        contador = 1
        for i in aux:
            contador = contador + 1
        num_id = contador
        
        paciente = Paciente(nome, cpf, sexo, telefone, celular, rua, bairro, numero, cidade, cep, estado, email, convenio)
        paciente.set_id(num_id)
        self.atualizar_base_arquivo_paciente("paciente.tab",paciente)

    #funcao que retorna uma lista com todos os objetos pacientes numa lista       
    def listar_pacientes(self):
        listaObj = self.carregar_base_arquivo("paciente.tab")
        lista = []
        for i in listaObj:
            lista.append(i.get_nome())
        return lista

# Funcao que altera determinado Paciente

    def altera_paciente(self, novo_paciente):
        self.lista_pacientes = self.carregar_base_arquivo("paciente.tab")
        
        for i in self.lista_pacientes:
            if i.get_id() == novo_paciente.get_id():
                self.atualizar_base_arquivo_paciente("paciente.tab",novo_paciente)


# Funcoes auxiliares de pesquisa
    def pesquisa_CPF(self, CPF):
        for i in self.lista_pacientes:
           if CPF == i.get_cpf():
               self.__paciente_selecionado = i
               break
           else:
               self.__paciente_selecionado = self.paciente_nulo    
                 
    def get_pesquisa_nome(self):
        return self.__pesquisa_nome
    
    def get_pesquisa_CPF(self):
        return self.__pesquisa_CPF

    

        ################ FUNCOES RELACIONADAS AO PROFISSIONAL ##################
        
    #funcao que cadastra o objeto profissional numa lista em um arquivo
    def cadastrar_profissional(self, nome, cpf, sexo, telefone, celular, rua, bairro, numero, cidade, cep, estado, email, especialidade):
        self.lista_profissionais=self.carregar_base_arquivo("profissional.tab")
        contador = 1
        for i in self.lista_profissionais:
            contador = contador + 1
        num_id = contador
        
        profissional = Profissional(nome, cpf, sexo, telefone, celular, rua, bairro, numero, cidade, cep, estado, email, especialidade)
        profissional.set_id(num_id)
        self.atualizar_base_arquivo_profissional("profissional.tab",profissional)
    

            
    def listar_lista_profissionais(self):
        
        self.lista_profissionais = self.carregar_base_arquivo("profissional.tab")
        #teste
        for i in self.lista_profissionais:
            print i.get_nome()
            print i.get_sexo()
        return self.lista_profissionais



# Funcoes auxiliares de pesquisa
    def pesquisa_CPF_profissional(self, CPF):
        self.lista_profissionais = self.carregar_base_arquivo("profissional.tab")
        for i in self.lista_profissionais:
           if CPF == i.get_cpf():
               self.__profissional_selecionado = i
               break
           else:
               self.__profissional_selecionado = self.paciente_nulo    
                 


# Funcao que altera determinado Profissional

    def altera_profissional(self, novo_profissional):
        self.lista_profissionais = self.carregar_base_arquivo("profissional.tab")
        
        for i in self.lista_profissionais:
            if i.get_id() == novo_profissional.get_id():
                i = novo_profissional
            
        self.atualizar_base_arquivo_profissional("profissional.tab",novo_profissional)

        
        ################ FUNCOES RELACIONADAS A RENDA ##################

    
    def cadastrar_renda(self, nome, valor, tempo):

        renda = Renda(nome,valor, tempo)
        self.lista_rendas = self.carregar_base_arquivo("renda.tab")
        self.atualizar_base_arquivo_renda("renda.tab",renda)
                   
    def listar_lista_rendas(self):
        self.lista_rendas = self.carregar_base_arquivo("renda.tab")
        #teste
        for i in self.lista_rendas:
            print i.get_nome()
            print i.get_valor()
            print i.get_tempo()

    def cadastrar_renda_pac(self, nome, valor, tempo):

        renda_paciente = RendaPaciente(nome,valor, tempo, self.paciente_retornar_convenio(nome))
        self.carregar_base_arquivo("rendaPac.tab")
        self.atualizar_base_arquivo_rendaPac("rendaPac.tab",renda_paciente)

    def listar_lista_rendas_pac(self):
        self.lista_rendasPac = self.carregar_base_arquivo("rendaPac.tab")
        #teste
        for i in self.lista_rendas:
            print i.get_nome()
            print i.get_valor()
            print i.get_tempo()
            print i.get_convenio()



    def paciente_retornar_convenio(self, nome):
       self.lista_pacientes = self.carregar_base_arquivo("paciente.tab")
       for i in self.lista_pacientes:
          if nome == i.get_nome():
              return i.get_convenio()
              break



#    def listar_pacientes(self):
 #       self.lista_nomes_pacientes=[]
  #      self.lista_pacientes=self.carregar_base_arquivo("paciente.tab")
   #     #teste para ver ser esta gravando no arquivo
    #    for i in self.lista_pacientes:
     #       lista_nomes_pacientes.append(i.get_nome())
      #  return self.lista_nomes_pacientes
        


    def listar_profissionais(self):
        lista_nomes_profissionais=[]
        self.lista_profissionais =self.carregar_base_arquivo("profissional.tab")
        #teste para ver ser esta gravando no arquivo
        for i in self.lista_profissionais:
            lista_nomes_profissionais.append(i.get_nome())
        return lista_nomes_profissionais  


    def trans_tempo(self, tempo):
        h = tempo.find('h')
        m = tempo.find('m')
        novo_tempo = int(tempo[:h]) + (float(tempo[h+1:m]))/60
        return novo_tempo
    




#################################FUNCOES RELACIONADAS A FONTE DE RENDA################################

    def adicionar_convenio(self, convenio):
        self.atualizar_base_arquivo_convenio("convenio.tab",convenio)


        
    def excluir_convenio(self, convenio):
        self.lista_convenios = self.carregar_base_arquivo("convenio.tab")
        arquivo = open("convenio.tab","w")
        for i in self.lista_convenios:
            if convenio == i:
                self.lista_convenios.remove(i)
        pickle.dump(self.lista_convenios,arquivo)
        arquivo.close()


    def get_lista_convenios(self):
        lista = self.carregar_base_arquivo("convenio.tab")
        listaNomeConvenio=[]
        for i in lista:
            listaNomeConvenio.append(i)
        return listaNomeConvenio
    



################################FUNCOES NOVAS 'EVISMAR'########################


#    def get_recebimento_convenio_nome(self):
 #       lista = self.get_lista_convenios()
  #      for i in lista:
            
            




































    

    
    ################ FUNCOES PARA DEBUG DO SISTEMA E FUNCOES DE APOIO##################

    def testePac(self):
        self.lista_pacientes= self.carregar_base_arquivo("paciente.tab")
        #teste para ver ser esta gravando no arquivo
        for i in self.lista_pacientes:
            print i.get_id()
            print i.get_nome()
            print i.get_cpf()
            print i.get_sexo()
            print i.get_telefone()
            print i.get_celular()
            print i.get_rua()
            print i.get_bairro()
            print i.get_numero()
            print i.get_cidade()
            print i.get_cep()
            print i.get_estado()
            print i.get_email()
            print i.get_convenio()
            print ''
            print ''
            print '' 

    def testePro(self):
        self.lista_profissionais = self.carregar_base_arquivo("profissional.tab")
        #teste para ver ser esta gravando no arquivo
        for i in self.lista_profissionais:
            print i.get_id()
            print i.get_nome()
            print i.get_cpf()
            print i.get_sexo()
            print i.get_telefone()
            print i.get_celular()
            print i.get_rua()
            print i.get_bairro()
            print i.get_numero()
            print i.get_cidade()
            print i.get_cep()
            print i.get_estado()
            print i.get_email()
            print i.get_especialidade()
            print ''
            print ''
            print ''
    
    def excluir_todos_pacientes(self):
        self.lista_pacientes = []

        self.arquivo = open("paciente.tab", "w")
        pickle.dump(self.lista_pacientes, self.arquivo)
        self.arquivo.close()


    def excluirRendaPac(self):
        self.lista_pacientes = []

        self.arquivo = open("rendaPac.tab", "w")
        pickle.dump(self.lista_pacientes, self.arquivo)
        self.arquivo.close()

    def excluirRenda(self):
        self.lista_pacientes = []

        self.arquivo = open("renda.tab", "w")
        pickle.dump(self.lista_pacientes, self.arquivo)
        self.arquivo.close()
        
    def excluirConvenios(self):
        self.lista_pacientes = []

        self.arquivo = open("convenio.tab", "w")
        pickle.dump(self.lista_pacientes, self.arquivo)
        self.arquivo.close()
        
    def excluir_todos_profissionais(self):
        self.lista_pacientes = []

        self.arquivo = open("profissional.tab", "w")
        pickle.dump(self.lista_pacientes, self.arquivo)
        self.arquivo.close()
        
            #Funcao que retorna os atributos do Objeto profissional
    def profissional_retornar(self, nome, item):
       self.lista_profissionais = self.carregar_base_arquivo("profissional.tab")

       for i in self.lista_profissionais:
          if nome == i.get_nome():
             if item == 'nome':
                 self.__pesquisa_nome = i.get_nome()
                 self.__pesquisa_CPF = i.get_cpf()
             if item == 'cpf':
                 self.__pesquisa_nome = i.get_cpf()
                 self.__pesquisa_nome = i.get_nome()
             if item == 'sexo':
                 self.__pesquisa_nome = i.get_sexo()
             if item == 'telefone':
                 self.__pesquisa_nome = i.get_telefone()
             if item == 'celular':
                 self.__pesquisa_nome = i.get_celular()
             if item == 'rua':
                 self.__pesquisa_nome = i.get_rua()
             if item == 'bairro':
                 self.__pesquisa_nome = i.get_bairro()
             if item == 'numero':
                 self.__pesquisa_nome = i.get_numero()
             if item == 'cidade':
                 self.__pesquisa_nome = i.get_cidade()
             if item == 'cep':
                 self.__pesquisa_nome = i.get_cep()
             if item == 'estado':
                 self.__pesquisa_nome = i.get_estado()
             if item == 'email':
                 self.__pesquisa_nome = i.get_email()
             if item == 'covenio':
                 self.__pesquisa_nome = i.get_convenio()

    
    #Funcaoo que retorna os atributos do Objeto paciente
    def paciente_retornar(self, nome, item):
       self.lista_pacientes = self.carregar_base_arquivo("paciente.tab")

       for i in self.lista_pacientes:
          if nome == i.get_nome():
             if item == 'nome':
                 self.__pesquisa_nome = i.get_nome()
                 self.__pesquisa_CPF = i.get_cpf()
             if item == 'cpf':
                 self.__pesquisa_nome = i.get_cpf()
                 self.__pesquisa_nome = i.get_nome()
             if item == 'sexo':
                 self.__pesquisa_nome = i.get_sexo()
             if item == 'telefone':
                 self.__pesquisa_nome = i.get_telefone()
             if item == 'celular':
                 self.__pesquisa_nome = i.get_celular()
             if item == 'rua':
                 self.__pesquisa_nome = i.get_rua()
             if item == 'bairro':
                 self.__pesquisa_nome = i.get_bairro()
             if item == 'numero':
                 self.__pesquisa_nome = i.get_numero()
             if item == 'cidade':
                 self.__pesquisa_nome = i.get_cidade()
             if item == 'cep':
                 self.__pesquisa_nome = i.get_cep()
             if item == 'estado':
                 self.__pesquisa_nome = i.get_estado()
             if item == 'email':
                 self.__pesquisa_nome = i.get_email()
             if item == 'covenio':
                 self.__pesquisa_nome = i.get_convenio()       

#Pac = Paciente('nom','cp','sex','tel','cel','ru','bai','num','cid','ce','est','ema','conv')
#Pro = Profissional('nom','cp','sex','tel','cel','ru','bai','num','cid','ce','est','ema','especialidade')
           
#instancia para testes do banco de dados        
bd = BancoDeDados()
#bd.paciente_retornar(Evinho, telefone)
        
